package manager.modulo.ferramenta.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.ferramenta.enumerator.EnumSituacaoFerramenta;
import manager.modulo.ferramenta.enumerator.EnumSituacaoFerramenta.SituacaoFerramenta;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class FerramentaDao implements InterfaceDao {

    private int id;
    private String identificador;
    private String nome;
    private int valor;
    private String fabricante;
    private String modelo;
    private SituacaoFerramenta situacao;
    private Timestamp dtCompra;
    private String descricao;
    private String localizacao;
    private int idFuncionario;

    /**
     * Inicializando as variáveis
     */
    public FerramentaDao() {
        identificador = "";
        nome = "";
        valor = 0;
        fabricante = "";
        modelo = "";
        situacao = SituacaoFerramenta.NAOENCONTRADO;
        dtCompra = new Timestamp(00 - 00 - 00);;
        descricao = "";
        idFuncionario = 0;
    }

    public static int getIdFerramentaPorIdentificador(String codigo) {
        try {

            String sql = "SELECT id FROM ferramenta WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, codigo);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Ferramentas");
            return 0;
        }
    }

    public static int getIdFerramentaPorNome(String nome) {
        try {

            String sql = "SELECT id FROM ferramenta WHERE tx_nome = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, nome);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Ferramentas");
            return 0;
        }
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Nome")) {// Buscando por Nome
                sql = "SELECT tx_nome FROM ferramenta WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT tx_identificador FROM ferramenta WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscarTabela(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Nome")) { // Buscando por nome
                sql = "SELECT "
                        + " f.id as IdFerramenta, "
                        + " f.tx_identificador as Identificador, "
                        + " f.tx_nome as Nome, "
                        + " f.tx_fabricante as Fabricante, "
                        + " f.tx_localizacao as Localizacao, "
                        + " f.cd_situacao as Situacao, "
                        + " fu.tx_identificador as Funcionario "
                        + "FROM "
                        + " ferramenta f "
                        + " LEFT JOIN funcionario fu ON fu.id = f.id_funcionario "
                        + "WHERE "
                        + " f.tx_nome LIKE ? "
                        + "ORDER BY f.tx_nome ";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT "
                        + " f.id as IdFerramenta, "
                        + " f.tx_identificador as Identificador, "
                        + " f.tx_nome as Nome, "
                        + " f.tx_fabricante as Fabricante, "
                        + " f.tx_localizacao as Localizacao, "
                        + " f.cd_situacao as Situacao, "
                        + " fu.tx_identificador as Funcionario "
                        + "FROM "
                        + " ferramenta f "
                        + " LEFT JOIN funcionario fu ON fu.id = f.id_funcionario "
                        + "WHERE "
                        + " f.tx_identificador LIKE ? "
                        + "ORDER BY f.tx_identificador ";
                palavraBuscada += "%";
            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaIdentificador = new LinkedList<String>();
                LinkedList<String> colunaNome = new LinkedList<String>();
                LinkedList<String> colunaFabricante = new LinkedList<String>();
                LinkedList<String> colunaLocalizacao = new LinkedList<String>();
                LinkedList<String> colunaSituacao = new LinkedList<String>();
                LinkedList<String> colunaFuncionario = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdFerramenta"));
                    colunaIdentificador.add(resultSet.getString("Identificador"));
                    colunaNome.add(resultSet.getString("Nome"));
                    colunaFabricante.add(resultSet.getString("Fabricante"));
                    colunaLocalizacao.add(resultSet.getString("Localizacao"));
                    colunaFuncionario.add(resultSet.getString("Funcionario") == null ? "" : resultSet.getString("Funcionario"));
                    colunaSituacao.add(EnumSituacaoFerramenta.ConvertEnumString(EnumSituacaoFerramenta.ConverterNumeroEnum(resultSet.getInt("Situacao"))));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaIdentificador);
                result.add(colunaNome);
                result.add(colunaFabricante);
                result.add(colunaLocalizacao);
                result.add(colunaSituacao);
                result.add(colunaFuncionario);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM ferramenta WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                identificador = resultSet.getString("tx_identificador");
                nome = resultSet.getString("tx_nome");
                valor = resultSet.getInt("nm_valor");
                fabricante = resultSet.getString("tx_fabricante");
                modelo = resultSet.getString("tx_modelo");
                situacao = EnumSituacaoFerramenta.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                dtCompra = resultSet.getTimestamp("dt_compra");
                descricao = resultSet.getString("tx_descricao");
                localizacao = resultSet.getString("tx_localizacao");
                idFuncionario = resultSet.getInt("id_funcionario");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Funcionários");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO ferramenta "
                + "(tx_identificador,"
                + " tx_nome,"
                + " nm_valor,"
                + " tx_fabricante,"
                + " tx_modelo,"
                + " cd_situacao,"
                + " dt_compra,"
                + "tx_descricao, "
                + "tx_localizacao, "
                + "id_funcionario) "
                + "VALUES ("
                + "?," // 01 Identificador
                + "?," // 02 Nome
                + "?," // 03 Valor
                + "?," // 04 Fabricante
                + "?," // 05 Modelo
                + "?," // 06 Situacao
                + "?," // 07 Data de Compra
                + "?," // 08 Descrição
                + "?," // 09 Localizacao
                + "?)"; // 10 Id Funcionario
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setInt(3, valor);
        preparedStatement.setString(4, fabricante);
        preparedStatement.setString(5, modelo);
        preparedStatement.setInt(6, EnumSituacaoFerramenta.ConverterEnumNumero(situacao));
        preparedStatement.setTimestamp(7, dtCompra);
        preparedStatement.setString(8, descricao);
        preparedStatement.setString(9, localizacao);
        preparedStatement.setInt(10, idFuncionario);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "  UPDATE ferramenta SET "
                + "     tx_identificador = ? ," // 01
                + "     tx_nome = ? ," // 02
                + "     nm_valor = ? ," // 03
                + "     tx_fabricante = ? ," // 04
                + "     tx_modelo = ? ," // 05
                + "     cd_situacao = ? ," // 06
                + "     dt_compra = ? ," // 07
                + "     tx_descricao = ?, " // 08
                + "     tx_localizacao = ?, " // 09
                + "     id_funcionario = ? " // 10
                + " WHERE "
                + "     id = ?";           // 11
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setInt(3, valor);
        preparedStatement.setString(4, fabricante);
        preparedStatement.setString(5, modelo);
        preparedStatement.setInt(6, EnumSituacaoFerramenta.ConverterEnumNumero(situacao));
        preparedStatement.setTimestamp(7, dtCompra);
        preparedStatement.setString(8, descricao);
        preparedStatement.setString(9, localizacao);
        preparedStatement.setInt(10, idFuncionario);
        preparedStatement.setInt(11, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getValor() {
        return valor;
    }

    public void setValor(int valor) {
        this.valor = valor;
    }

    public String getFabricante() {
        return fabricante;
    }

    public void setFabricante(String fabricante) {
        this.fabricante = fabricante;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public SituacaoFerramenta getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoFerramenta situacao) {
        this.situacao = situacao;
    }

    public Timestamp getDtCompra() {
        return dtCompra;
    }

    public void setDtCompra(Timestamp dtCompra) {
        this.dtCompra = dtCompra;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getLocalizacao() {
        return localizacao;
    }

    public void setLocalizacao(String localizacao) {
        this.localizacao = localizacao;
    }

    public int getIdFuncionario() {
        return idFuncionario;
    }

    public void setIdFuncionario(int idFuncionario) {
        this.idFuncionario = idFuncionario;
    }
}
